package com.universe.titan.server;

import lombok.Data;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Author : linmaobo
 * @create 2022/12/8
 * webSocket服务
 * 等于是事件处理器，每个映射路径都为一个ServerEndpointExporter服务端点
 */
@Data
@ServerEndpoint("/{uuid}")    //相当于映射路径
@Component
public class WebSocketServer {

    /**
     * Session客户端
     */
    private Session session;

    /**
     * 用于存储句用户消息   String-用户的唯一身边标识   WebSocketServer-表示该用户与webSocket服务长链接通信的WebSocketServer
     */
    public static ConcurrentHashMap<String,WebSocketServer> clients = new ConcurrentHashMap<>();


    /**
     * onOpen：表示在客户端与服务器建立链接的时候触发
     * @param session  Session客户端
     * 将客户端的信息，已经客户端对象存入线程同步的hashmap中
     */
    // TODO 进行存储用户信息，进行身份验证合法性（方案使用jwt或者token，从请求头获取）
    @OnOpen
    public void onOpen(Session session, @PathParam( "uuid") String uuid) {
        this.session = session;
        clients.put(uuid, this);
        System.out.println("客户端连接===>"+ session);
        System.out.println("客户端标识===>"+ uuid);
        System.out.println("map===>"+ clients);
    }

    /**
     * onClose： 当客户端和服务端连接关闭时触发
     * @param uuid 用户身边唯一标识
     * 将客户信息从map移除
     */
    @OnClose
    public void onClose(@PathParam( "uuid") String uuid){
        System.out.println("客户端断开链接： " + uuid );
        clients.remove(uuid);
    }

    /**
     * onError： 当客户端和服务端连接发生错误触发
     * @param error
     * 打印出错的栈信息
     */
    @OnError
    public void onError(Throwable error) {
        error.printStackTrace();
    }

    /**
     * OnMessage： 当客户端向服务端发送信息时触发
     * @param message
     */
    @OnMessage
    public void OnMessage(String message){
        System.out.println("发送信息：" + message);
    }


}